#define ISA_START_ADDRESS 0x0
#define ISA_END_ADDRESS 0x100000
+#if 0 /* not PAE safe */
/* These hacky macros avoid phys->machine translations. */
#define __direct_pte(x) ((pte_t) { (x) } )
#define __direct_mk_pte(page_nr,pgprot) \
__direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
#define direct_mk_pte_phys(physpage, pgprot) \
__direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot)
-
+#endif
static int direct_remap_area_pte_fn(pte_t *pte,
struct page *pte_page,
{
mmu_update_t **v = (mmu_update_t **)data;
- (*v)->ptr = ((maddr_t)pfn_to_mfn(page_to_pfn(pte_page)) <<
+ (*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pte_page)) <<
PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
(*v)++;
return 0;
}
-int direct_remap_area_pages(struct mm_struct *mm,
+int direct_remap_pfn_range(struct mm_struct *mm,
unsigned long address,
- unsigned long machine_addr,
+ unsigned long mfn,
unsigned long size,
pgprot_t prot,
domid_t domid)
* Fill in the machine address: PTE ptr is done later by
* __direct_remap_area_pages().
*/
- v->val = pte_val_ma(pfn_pte_ma(machine_addr >> PAGE_SHIFT, prot));
+ v->val = pte_val_ma(pfn_pte_ma(mfn, prot));
- machine_addr += PAGE_SIZE;
+ mfn++;
address += PAGE_SIZE;
v++;
}
return 0;
}
-EXPORT_SYMBOL(direct_remap_area_pages);
+EXPORT_SYMBOL(direct_remap_pfn_range);
+
+/* FIXME: This is horribly broken on PAE */
static int lookup_pte_fn(
pte_t *pte, struct page *pte_page, unsigned long addr, void *data)
{
#ifdef __x86_64__
flags |= _PAGE_USER;
#endif
- if (direct_remap_area_pages(&init_mm, (unsigned long) addr, phys_addr,
+ if (direct_remap_pfn_range(&init_mm, (unsigned long) addr, phys_addr>>PAGE_SHIFT,
size, __pgprot(flags), domid)) {
vunmap((void __force *) addr);
return NULL;
pgprot_t prot = __pgprot(_KERNPG_TABLE);
int err;
- err = direct_remap_area_pages(&init_mm, localaddr,
- tx_ring_ref<<PAGE_SHIFT, PAGE_SIZE,
+ err = direct_remap_pfn_range(&init_mm, localaddr,
+ tx_ring_ref, PAGE_SIZE,
prot, netif->domid);
- err |= direct_remap_area_pages(&init_mm, localaddr + PAGE_SIZE,
- rx_ring_ref<<PAGE_SHIFT, PAGE_SIZE,
+ err |= direct_remap_pfn_range(&init_mm, localaddr + PAGE_SIZE,
+ rx_ring_ref, PAGE_SIZE,
prot, netif->domid);
if (err)
if ( (msg[j].va + (msg[j].npages<<PAGE_SHIFT)) > vma->vm_end )
return -EINVAL;
- if ( (rc = direct_remap_area_pages(vma->vm_mm,
+ if ( (rc = direct_remap_pfn_range(vma->vm_mm,
msg[j].va&PAGE_MASK,
- msg[j].mfn<<PAGE_SHIFT,
+ msg[j].mfn,
msg[j].npages<<PAGE_SHIFT,
vma->vm_page_prot,
mmapcmd.dom)) < 0 )
}
prot = __pgprot(_KERNPG_TABLE);
- error = direct_remap_area_pages(&init_mm, VMALLOC_VMADDR(vma->addr),
- shmem_frame<<PAGE_SHIFT, PAGE_SIZE,
+ error = direct_remap_pfn_range(&init_mm, VMALLOC_VMADDR(vma->addr),
+ shmem_frame, PAGE_SIZE,
prot, domid);
if ( error != 0 )
{
#define kern_addr_valid(addr) (1)
#endif /* !CONFIG_DISCONTIGMEM */
-int direct_remap_area_pages(struct mm_struct *mm,
+int direct_remap_pfn_range(struct mm_struct *mm,
unsigned long address,
- unsigned long machine_addr,
+ unsigned long mfn,
unsigned long size,
pgprot_t prot,
domid_t domid);
unsigned long size);
#define io_remap_page_range(vma,from,phys,size,prot) \
-direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO)
+direct_remap_pfn_range(vma->vm_mm,from,phys>>PAGE_SHIFT,size,prot,DOMID_IO)
#define io_remap_pfn_range(vma,from,pfn,size,prot) \
-direct_remap_area_pages(vma->vm_mm,from,pfn<<PAGE_SHIFT,size,prot,DOMID_IO)
+direct_remap_pfn_range(vma->vm_mm,from,pfn,size,prot,DOMID_IO)
#define MK_IOSPACE_PFN(space, pfn) (pfn)
#define GET_IOSPACE(pfn) 0
#define DOMID_LOCAL (0xFFFFU)
-int direct_remap_area_pages(struct mm_struct *mm,
+int direct_remap_pfn_range(struct mm_struct *mm,
unsigned long address,
- unsigned long machine_addr,
+ unsigned long mfn,
unsigned long size,
pgprot_t prot,
domid_t domid);
-int __direct_remap_area_pages(struct mm_struct *mm,
- unsigned long address,
- unsigned long size,
- mmu_update_t *v);
+
int create_lookup_pte_addr(struct mm_struct *mm,
unsigned long address,
unsigned long *ptep);
+
int touch_pte_range(struct mm_struct *mm,
unsigned long address,
unsigned long size);
#define io_remap_page_range(vma, vaddr, paddr, size, prot) \
- direct_remap_area_pages((vma)->vm_mm,vaddr,paddr,size,prot,DOMID_IO)
+ direct_remap_pfn_range((vma)->vm_mm,vaddr,paddr>>PAGE_SHIFT,size,prot,DOMID_IO)
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
- direct_remap_area_pages((vma)->vm_mm,vaddr,(pfn)<<PAGE_SHIFT,size,prot,DOMID_IO)
+ direct_remap_pfn_range((vma)->vm_mm,vaddr,pfn,size,prot,DOMID_IO)
#define MK_IOSPACE_PFN(space, pfn) (pfn)
#define GET_IOSPACE(pfn) 0